package com.gql.methodReferences;


import org.junit.jupiter.api.Test;
import org.omg.PortableInterceptor.INACTIVE;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*;

/**
 * 方法引用的使用
 *
 * @author gql
 */
public class MethodRefTest {

    // 情况一：对象 :: 实例方法
    //Consumer中的void accept(T t)
    //PrintStream中的void println(T t)
    @Test
    public void test1() {
        // lambda写法
        Consumer<String> con1 = str -> {
            System.out.println(str);
        };
        con1.accept("北京");
        //**************************************************
        // 方法引用写法
        Consumer<String> con2 = System.out::println;
        con2.accept("上海");

    }

    //Supplier中的T get()
    //Employee中的String getName()
    @Test
    public void test2() {
        Employee emp = new Employee(1001, "Tom", 23, 5600);
        // lambda写法
        Supplier<String> sup1 = () -> emp.getName();
        System.out.println("sup1.get() = " + sup1.get());
        //**************************************************
        // 方法引用写法
        Supplier<String> sup2 = emp::getName;
        System.out.println("sup2.get() = " + sup2.get());
    }

    // 情况二：类 :: 静态方法
    //Comparator中的int compare(T t1,T t2)
    //Integer中的int compare(T t1,T t2)
    @Test
    public void test3() {
        // lambda写法
        Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1, t2);
        System.out.println("com1.compare(12,13) = " + com1.compare(12, 13));
        //**************************************************
        // 函数式写法
        Comparator<Integer> com2 = Integer::compare;
        System.out.println("com2.compare(13,15) = " + com2.compare(13, 15));
    }

    //Function中的R apply(T t)
    //Math中的Long round(Double d)
    @Test
    public void test4() {
        // lambda写法
        Function<Double, Long> fun1 = d -> Math.round(d);
        System.out.println("fun1.apply(12.3) = " + fun1.apply(12.3));
        //**************************************************
        // 函数式写法
        Function<Double, Long> fun2 = Math::round;
        System.out.println("fun2.apply(13.6) = " + fun2.apply(13.6));

    }

    // 情况三：类 :: 实例方法
    // Comparator中的int comapre(T t1,T t2)
    // String中的int t1.compareTo(t2)
    @Test
    public void test5() {
        // lambda写法
        Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
        System.out.println(com1.compare("a", "b"));
        // 函数式写法
        Comparator<String> com2 = String::compareTo;
        System.out.println(com2.compare("a", "b"));

    }

    //BiPredicate中的boolean test(T t1, T t2);
    //String中的boolean t1.equals(t2)
    @Test
    public void test6() {
        // lambda写法
        BiPredicate<String, String> pre1 = (s1, s2) -> s1.equals(s2);
        System.out.println(pre1.test("abc", "abc"));
        //**************************************************
        // 方法引用写法
        BiPredicate<String, String> pre2 = String::equals;
        System.out.println(pre2.test("a", "a"));
    }

    // Function中的R apply(T t)
    // Employee中的String getName();
    @Test
    public void test7() {
        Employee emp = new Employee(1001, "Tom", 23, 5600);
        //lambda写法
        Function<Employee, String> fun1 = e -> e.getName();
        System.out.println(fun1.apply(emp));
        //**************************************************
        // 方法引用写法
        Function<Employee, String> fun2 = Employee::getName;
        System.out.println(fun2.apply(emp));
    }

}
